


export default class FrameLoad{
    static timeEveryFrame : number = 0.016;     //单位毫秒
    static itemCount : number = 0;
    static event : any = null;

    /**
     * 分帧加载
     * @param itemCount 加载的项目的数量
     * @param event 要对项目做的操作 比如说 初始化Item
     * @param percent 占用每一帧多少比例的时间
     * @param node 一个节点用来调用定时器,这个很随意
     * @example
        let fuben = GameConfig[kind].concat();
        let callback = (i)=>{
            let item = this.getIconNode();
            item.parent = this.GridContent;
            item.getComponent('IconPrefab').setPropInfo(fuben[i], this);
        }
        FrameLoad.initScrollView(fuben.length,callback,0.5,this.node);
     * 
     */
    static async initScrollView (itemCount,event,percent,node) {
        FrameLoad.itemCount = itemCount;
        FrameLoad.event = event;
        await FrameLoad.executePreFrame(FrameLoad.gener(),percent,node);
    }

    static *gener(){
        for(let i=0;i<FrameLoad.itemCount;i++){
            yield FrameLoad.event && FrameLoad.event(i);
        }
    }

    static executePreFrame(generator: Generator, percent: number,node) {
        var duration = FrameLoad.timeEveryFrame * percent;
        return new Promise((resolve, reject) => {
            let gen = generator;
            // 创建执行函数
            let execute = () => {
                // 执行之前，先记录开始时间
                let startTime = new Date().getTime();

                // 然后一直从 Generator 中获取已经拆分好的代码段出来执行
                for (let iter = gen.next(); ; iter = gen.next()) {
                    // 判断是否已经执行完所有 Generator 的小代码段，如果是的话，那么就表示任务完成
                    if (iter == null || iter.done) {
                        resolve();
                        return;
                    }

                    // 每执行完一段小代码段，都检查一下是否已经超过我们分配的本帧，这些小代码端的最大可执行时间
                    if (new Date().getTime() - startTime > duration) {
                        // 如果超过了，那么本帧就不在执行，开定时器，让下一帧再执行
                        node.getComponent(cc.Component).scheduleOnce(() => {
                            Log('----------------------')
                            execute();
                        });
                        return;
                    }
                }
            };

            // 运行执行函数
            execute();
        });
    }

}
